package model.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import model.dao.AssetDAO;
import model.vo.AssetBaseVO;
import model.vo.AssetImpotantVO;
import model.vo.AssetListVO;
import model.vo.AssetPercenTageVO;
import model.vo.AssetScVO;
import model.vo.JobProcessVO;
import model.vo.OptinfoVO;
import model.vo.PyungBaseVO;

public class AssetServiceImpl implements AssetService {
	private AssetDAO assetDAO;
	@Override
	public void setAssetDAO(AssetDAO assetDAO) {
		this.assetDAO = assetDAO;
	}
	//최대 순번 구하기
	public int maxNo(String menuName) throws SQLException{
			int maxNo=0;
		if(menuName.equals("assetBase_maxNo")){
			maxNo=assetDAO.assetBase_maxNo();
		}else if(menuName.equals("jobProcess_maxNo")){
			maxNo=assetDAO.jobProcess_maxNo();
		}else if(menuName.equals("pyung_maxNo")){
			maxNo=assetDAO.pyung_maxNo();
		}else if(menuName.equals("assetImpotant_maxNo")){
			maxNo=assetDAO.assetImpotant_maxNo();
		}else if(menuName.equals("assetSecurity_maxNo")){
			/*구분값을 페이지에서 받거나, 이곳에서 입력해서 읽어옴.(보안 등급 페이지에서는
			구분값 1만 읽을것이기 때문에 따로 읽어오지 않고 직접 입력하겠음
			(여기서 값을 입력한 이유는 a 태그로 넘기면 get방식으로 넘어오기 때문에
			다른 값을 입력하여 볼수 있을지도 모르기때문에 직접 입력*/
			String gubun="1";
			maxNo=assetDAO.assetSecurity_maxNo(gubun);
		}
		return maxNo;
	}
	//[자산 평가 IPO]
	//1.카탈로그
	//(자산분류기준)
	//자산분류기준페이지로 이동
	@Override
	public List assetBase() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetBase();
	}
	//최대 순번 구해오기
	/*
	@Override
	public Integer assetMaxNo() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetMaxNo();
	}
	*/
	//자산 분류 기준 등록
	@Override
	public void assetBase_insert(AssetBaseVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetBase_insert(vo);
	}
	//자산 분류 기준 삭제
	@Override
	public void assetBase_delete(String assetNo) throws SQLException {
		// TODO Auto-generated method stub
		int asset_no=Integer.parseInt(assetNo);
		assetDAO.assetBase_delete(asset_no);
	}
	//자산 분류 수정 페이지로 이동
	@Override
	public AssetBaseVO assetBase_updatePage(String assetNo) throws SQLException {
		// TODO Auto-generated method stub
		int asset_no=Integer.parseInt(assetNo);
		return assetDAO.assetBase_updatePage(asset_no);
	}
	//자산 분류 수정
	@Override
	public void assetBase_update(AssetBaseVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetBase_update(vo);
	}
	
	
	
	//(업무프로세스)
	//업무프로세스 페이지로 이동
	@Override
	public List jobProcess() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.jobProcess();
	}
	//최대 순번 구해오기
	/*
	@Override
	public Integer jobProcessMaxNo() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.jobProcessMaxNo();
	}
	*/
	//업무프로세스 등록
	@Override
	public void jobProcess_insert(JobProcessVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.jobProcess_insert(vo);
	}
	//업무프로세스 삭제
	@Override
	public void jobProcess_delete(String jobNo) throws SQLException {
		// TODO Auto-generated method stub
		int job_no=Integer.parseInt(jobNo);
		assetDAO.jobProcess_delete(job_no);
	}
	//업무프로세스 수정 페이지로 이동
	@Override
	public JobProcessVO jobProcess_updatePage(String jobNo) throws SQLException {
		// TODO Auto-generated method stub
		int job_no=Integer.parseInt(jobNo);
		return assetDAO.jobProcess_updatePage(job_no);
	}
	//업무프로세스 수정
	@Override
	public void jobProcess_update(JobProcessVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.jobProcess_update(vo);
	}
	
	
	
	
	
	
	//2.평가기준
	//(업무프로세스중요도)
	//업무프로세스중요도 페이지로 이동
	@Override
	public List pyungBase() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.pyungBase();
	}
	//최대 순번 구해오기
	/*
	@Override
	public Integer pyungMaxNo() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.pyungMaxNo();
	}
	*/
	//업무프로세스 중요도 등록
	@Override
	public void pyung_insert(PyungBaseVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.pyung_insert(vo);
	}
	//업무프로세스 중요도 삭제
	@Override
	public void pyung_delete(String pNo) throws SQLException {
		// TODO Auto-generated method stub
		int no=Integer.parseInt(pNo);
		assetDAO.pyung_delete(no);
	}
	//업무프로세스 중요도 수정 페이지로 이동
	@Override
	public PyungBaseVO pyung_updatePage(String pNo) throws SQLException {
		// TODO Auto-generated method stub
		int no=Integer.parseInt(pNo);
		return assetDAO.pyung_updatePage(no);
	}
	//업무프로세스 중요도 수정
	@Override
	public void pyung_update(PyungBaseVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.pyung_update(vo);
	}
	
	
	
	//(자산중요도평가기준)
	//자산중요도평가기준 페이지로 이동
	@Override
	public List assetImpotant() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetImpotant();
	}
	//최대 순번 구해오기
	/*
	@Override
	public Integer assetResultMaxNo() throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetResultMaxNo();
	}
	*/
	//자산중요도평가기준 등록
	@Override
	public void assetImpotant_insert(AssetImpotantVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetImpotant_insert(vo);
	}
	//자산중요도평가기준 삭제
	@Override
	public void assetImpotant_delete(String impoNo) throws SQLException {
		// TODO Auto-generated method stub
		int impo_no=Integer.parseInt(impoNo);
		assetDAO.assetImpotant_delete(impo_no);
	}
	//자산중요도평가기준 수정 페이지로 이동
	@Override
	public AssetImpotantVO assetImpotant_updatePage(String impoNo) throws SQLException {
		// TODO Auto-generated method stub
		int impo_no=Integer.parseInt(impoNo);
		return assetDAO.assetImpotant_updatePage(impo_no);
	}
	//자산중요도평가기준 수정
	@Override
	public void assetImpotant_update(AssetImpotantVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetImpotant_update(vo);
	}
	
	
	
	//(자산보안등급평가)
	//자산보안등급평가 페이지로 이동
	@Override
	public List assetSecurity(String gubun) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetSecurity(gubun);
	}
	//최대 순번 구해오기
	/*
	@Override
	public Integer assetScMaxNo(String gubun) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetScMaxNo(gubun);
	}
	*/
	//자산보안등급평가 등록
	@Override
	public void assetSecurity_insert(AssetScVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetSecurity_insert(vo);
	}
	//자산보안등급평가 삭제
	@Override
	public void assetSecurity_delete(String scNo,String gubun) throws SQLException {
		// TODO Auto-generated method stub
		int no=Integer.parseInt(scNo);
		AssetScVO vo=new AssetScVO();
		vo.setNo(no);
		vo.setGubun(gubun);
		assetDAO.assetSecurity_delete(vo);
	}
	//자산보안등급평가 수정 페이지로 이동
	@Override
	public AssetScVO assetSecurity_updatePage(String scNo,String gubun) throws SQLException {
		// TODO Auto-generated method stub
		int no=Integer.parseInt(scNo);
		AssetScVO vo=new AssetScVO();
		vo.setNo(no);
		vo.setGubun(gubun);
		return assetDAO.assetSecurity_updatePage(vo);
	}
	//자산보안등급평가 수정
	@Override
	public void assetSecurity_update(AssetScVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetSecurity_update(vo);
	}
	
	
	
	
	
	//3.자산 식별 및 평가 
	//(자산식별)
	//자산식별 페이지로 이동
	@Override
	public List assetIdenty_list(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		return  assetDAO.assetIdenty_list(vo);
	}
	//자산 코드 유효성 검사
	@Override
	public boolean searchAcd(String a_cd) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.searchAcd(a_cd);
	}
	//자산 식별 등록
	@Override
	public void assetIdenty_insert(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetIdenty_insert(vo);
	}
	//자산 식별(추가테이블) 등록
	@Override
	public void assetIdenty_insertOpt(OptinfoVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetIdenty_insertOpt(vo);
	}
	//자산 식별 삭제
	@Override
	public void assetIdentyDelete(String deleteA_cd) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetIdentyDelete(deleteA_cd);
		assetDAO.assetIdentyOptDelete(deleteA_cd);
	}
	//자산 식별 수정 페이지로 이동
	@Override
	public AssetListVO assetIdenty_updatePage(String a_cd) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetIdenty_updatePage(a_cd);
	}
	//자산 식별 수정 페이지로 이동(optVO정보)
	@Override
	public OptinfoVO assetIdentyOpt_updatePage(String a_cd) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetIdentyOpt_updatePage(a_cd);
	}
	//자산 식별 수정
	@Override
	public void assetIdenty_update(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetIdenty_update(vo);
	}
	//자산 식별(추가테이블) 수정
	@Override
	public void assetIdenty_updateOpt(OptinfoVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetIdenty_updateOpt(vo);
	}
	
	
	
	//(자산평가)
	//자산 평가 페이지로 이동
	@Override
	public List assetResult_list(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		return  assetDAO.assetResult_list(vo);
	}
	// sc_score(점수 테이블 호출)
	@Override
	public List sc_score() throws SQLException {
		//점수 값을 호출하기 위해 gubun 2값을 넣어줌
		String gubun="2";
		return assetDAO.sc_score(gubun);
	}
	//자산 평가 수정 페이지로 이동
	@Override
	public AssetListVO assetResult_updatePage(String a_cd) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.assetResult_updatePage(a_cd);
	}
	//자산 평가 수정
	@Override
	public void assetResult_update(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		assetDAO.assetResult_update(vo);
	}
	
	
	
	//(자산 목록)
	//자산 목록 페이지로 이동
	@Override
	public List assetList(AssetListVO vo) throws SQLException {
		// TODO Auto-generated method stub
		return  assetDAO.assetList(vo);
	}
	/*@Override
	public float percenTage(HashMap map) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.percenTage(map);
	}*/
	//자산유형별로 숫자를 새는 메서드
	@Override
	public Map counts(HashMap map) throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.counts(map);
	}
	//퍼센테이지를 구하는 메서드
	@Override
	public AssetPercenTageVO percenTage(AssetPercenTageVO vo)
			throws SQLException {
		// TODO Auto-generated method stub
		return assetDAO.percenTage(vo);
	}
	
	//퍼센트 계산
	@Override
	public ArrayList percenTageList(List assetBaseList, List ciaKindList)
			throws SQLException {
		int totalFirstCountSum=0;
		int totalSecondCountSum=0;
		int totalThirdCountSum=0;
		int totalPendencyCountSum=0;
		int totalGradeSum=0;
		float totalPercentSum=0;
		AssetPercenTageVO ptvo=null;
		ArrayList percentList = new ArrayList();
		//자산 분류기준 테이블 정보
		AssetBaseVO bvo=new AssetBaseVO();
		//등급 정보를 담을 공간
		AssetImpotantVO rvo=null;
		//count 수를 구할 정보 입력
		HashMap map=new HashMap();
		//count 수를 가져온 map
		Map savemap=null;
		//map 타입을 읽기 위한 함수
		Iterator it=null;
		//모든 정보를 저장하는 공간
		AssetPercenTageVO tvo=null;
		//퍼센테이지 정보를 저장할 공간
		AssetPercenTageVO tvo1=null;
		//전체 총합을 구하기 위한 공간
		AssetPercenTageVO tvo2=new AssetPercenTageVO();
		
		//유형별 값을 입력
		for(int i=0;i<assetBaseList.size();i++){
			bvo=(AssetBaseVO) assetBaseList.get(i);
			//자산 비율 페이지 정보 VO
			tvo=new AssetPercenTageVO();
			tvo1=new AssetPercenTageVO();
			//자산 번호 저장
			tvo.setAsset_no(bvo.getAsset_no());
			//자산 유형 저장
			tvo.setAsset_kind(bvo.getAsset_kind());
			//등급 입력
			for(int j=0;j<ciaKindList.size();j++){
				rvo=(AssetImpotantVO)ciaKindList.get(j);
				//등급에 따라 숫자 가져와서 세팅
				if(rvo.getImpo_no()==1){
					//tvo.setFirstGradeName(rvo.getImpo_kind());
					map.put("asset_no", tvo.getAsset_no());
					map.put("cia_kind", rvo.getImpo_kind());
					//유형별 등급별로 숫자를 받아옴
					savemap=assetDAO.counts(map);
					//System.out.println(savemap);
					it=savemap.keySet().iterator();
					//받아온 값을 루프를 돌리며 저장
					while(it.hasNext()){
						String key=it.next().toString();
						//System.out.println("key: "+key+" value="+savemap.get(key));
						int num=(Integer) savemap.get(key);
						if(key.equals("assetNoTotal")){
							tvo.setAssetNoTotalCount(num);
						}else if(key.equals("gradeCount")){
							//1등급 숫자 저장
							tvo.setFirstCount(num);
						}else if(key.equals("totalCount")){
							tvo.setTotalCount(num);
						}
					}
				}else if(rvo.getImpo_no()==2){
					map.put("asset_no", tvo.getAsset_no());
					map.put("cia_kind", rvo.getImpo_kind());
					savemap=assetDAO.counts(map);
					//System.out.println(savemap);
					it=savemap.keySet().iterator();
					while(it.hasNext()){
						String key=it.next().toString();
						//System.out.println("key: "+key+" value="+savemap.get(key));
						int num=(Integer) savemap.get(key);
						if(key.equals("assetNoTotal")){
							tvo.setAssetNoTotalCount(num);
						}else if(key.equals("gradeCount")){
							//2등급 숫자 저장
							tvo.setSecondCount(num);
						}else if(key.equals("totalCount")){
							tvo.setTotalCount(num);
						}
					}
				}else if(rvo.getImpo_no()==3){
					map.put("asset_no", tvo.getAsset_no());
					map.put("cia_kind", rvo.getImpo_kind());
					savemap=assetDAO.counts(map);
					//System.out.println(savemap);
					it=savemap.keySet().iterator();
					while(it.hasNext()){
						String key=it.next().toString();
						//System.out.println("key: "+key+" value="+savemap.get(key));
						int num=(Integer) savemap.get(key);
						if(key.equals("assetNoTotal")){
							tvo.setAssetNoTotalCount(num);
						}else if(key.equals("gradeCount")){
							//3등급 숫자 저장
							tvo.setThirdCount(num);
						}else if(key.equals("totalCount")){
							tvo.setTotalCount(num);
						}
					}
				}
			}
			//미결정 값					자산유형총계				-			1등급	 수		-		2등급 수			-	3등급 수
			int pendencyCount=tvo.getAssetNoTotalCount()-tvo.getFirstCount()-tvo.getSecondCount()-tvo.getThirdCount();
			tvo.setPendencyCount(pendencyCount);
			//수가 0이 아닐때
			if(tvo.getAssetNoTotalCount()!=0 && tvo.getTotalCount()!=0){
				tvo1=assetDAO.percenTage(tvo);
				System.out.println(tvo1.getAssetNoTotalGrade());
				float assetTotalGrade=tvo1.getAssetNoTotalGrade();
				//다 합쳐질시 99.99나 100.01이 나오면 100으로 세팅
				if(assetTotalGrade==99.99f || assetTotalGrade==100.01f){
					tvo.setAssetNoTotalGrade(100);
					System.out.println(tvo.getAssetNoTotalGrade());
				}else{
					tvo.setAssetNoTotalGrade(tvo1.getAssetNoTotalGrade());
				}
				tvo.setFirstGrade(tvo1.getFirstGrade());
				tvo.setSecondGrade(tvo1.getSecondGrade());
				tvo.setThirdGrade(tvo1.getThirdGrade());
				tvo.setPendencyGrade(tvo1.getPendencyGrade());
				tvo.setTotalGrade(tvo1.getTotalGrade());
			}
			System.out.println("tvo:"+tvo);
			//리스트에 저장
			percentList.add(tvo);
		}
		
		// 전체 총합 & 퍼센트
		for(int i=0;i<percentList.size();i++){
			ptvo=(AssetPercenTageVO)percentList.get(i);
			int firstCountSum =ptvo.getFirstCount();
			totalFirstCountSum=totalFirstCountSum+firstCountSum;
			int secondCountSum =ptvo.getSecondCount();
			totalSecondCountSum=totalSecondCountSum+secondCountSum;
			int thirdCountSum =ptvo.getThirdCount();
			totalThirdCountSum=totalThirdCountSum+thirdCountSum;
			int pendencyCountSum =ptvo.getPendencyCount();
			totalPendencyCountSum=totalPendencyCountSum+pendencyCountSum;
			int gradeSum =ptvo.getAssetNoTotalCount();
			totalGradeSum=totalGradeSum+gradeSum;
			float totalPercent=ptvo.getTotalGrade();
			totalPercentSum=totalPercentSum+totalPercent;
		}
		tvo2.setAsset_kind("전체");
		tvo2.setFirstCount(totalFirstCountSum);
		tvo2.setSecondCount(totalSecondCountSum);
		tvo2.setThirdCount(totalThirdCountSum);
		tvo2.setPendencyCount(totalPendencyCountSum);
		tvo2.setAssetNoTotalCount(totalGradeSum);
		if(tvo==null){
			tvo2.setTotalCount(0);
		}else{
			tvo2.setTotalCount(tvo.getTotalCount());
		}
		/*
		if(totalPercentSum>=99.99f && totalPercentSum<=100.01f){
			tvo2.setTotalGrade(100);
		}else{
			tvo2.setTotalGrade(totalPercentSum);
		}
		*/
		if(tvo2.getAssetNoTotalCount()!=0 && tvo2.getTotalCount()!=0){
			tvo1=assetDAO.percenTage(tvo2);
			float assetTotalGrade=tvo1.getAssetNoTotalGrade();
			//다 합쳐질시 99.99나 100.01이 나오면 100으로 세팅
			if(assetTotalGrade>=99.99f && assetTotalGrade<=100.01f){
				tvo2.setAssetNoTotalGrade(100);
			}else{
				tvo2.setAssetNoTotalGrade(tvo1.getAssetNoTotalGrade());
			}
			tvo2.setFirstGrade(tvo1.getFirstGrade());
			tvo2.setSecondGrade(tvo1.getSecondGrade());
			tvo2.setThirdGrade(tvo1.getThirdGrade());
			tvo2.setPendencyGrade(tvo1.getPendencyGrade());
			
			tvo2.setTotalGrade(tvo1.getTotalGrade());
		}
		percentList.add(tvo2);
		System.out.println(percentList);
		
		return percentList;
	}
}
